let arr = [
  1,
  1,
  "true",
  "true",
  true,
  true,
  15,
  15,
  false,
  false,
  undefined,
  undefined,
  null,
  null,
  NaN,
  NaN,
  "NaN",
  0,
  0,
  "a",
  "a",
  {},
  {},
];

// Set
// 无法去掉 {} 空对象
// let unique = function(array){
//     return Array.from(new Set(array));
// }

// 双重for循环,splice去重
// 无法去掉 {} 空对象
// let unique = function (array) {
//   for (let i = 0; i < array.length; i++) {
//     for (let j = i + 1; j < array.length; j++) {
//       if (array[i] === array[j]) {
//         array.splice(j, 1);
//         j--;
//       }
//     }
//   }

//   return array;
// };

// indexof去重
// let unique = function (array) {
//     let res= [];

//     array.forEach((item) => {
//         if (res.indexOf(item) === -1) {
//             res.push(item);
//         }
//     })

//     return res
// }

// includes去重
// let unique = function (array) {
//     let res= [];

//     array.forEach((item) => {
//         if (!res.includes(item)) {
//             res.push(item);
//         }
//     })

//     return res
// }

// sort排序去重
// let unique = function (array) {
//     array.sort();

//     let res = [array[0]];

//     for (let i = 1; i < array.length; i++) {
//         if (array[i] !== array[i - 1]) {
//             res.push(array[i]);
//         }
//     }

//     return res;
// }

// filter+indexof去重
// let unique = function (array) {
//     return array.filter((item, index) => {
//         return array.indexOf(item) === index;
//     });
// }

// reduce+includdes去重
// let unique = function (array) {
//     return array.reduce((prev, cur) =>  {
//         return prev.includes(cur) ? prev : prev.concat(cur);
//     },[])
// }

// 利用 hasOwnProperty
let unique = function (array) {
    let obj = {};

    return array.filter((item, index) =>  {
        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
    })
}

console.log(unique(arr));
